/**
 *  交换数组相邻元素位置
 *
 * @param {[]} arr
 * @param {number} indexA
 * @param {number} indexB
 */
function swap(arr: number[], indexA: number, indexB: number) {
  [arr[indexA], arr[indexB]] = [arr[indexB], arr[indexA]];
}

/**
 * 冒泡排序，依次比较、交换相邻元素的大小
 *
 * @param {[]} arr
 */
function bubbleSort(arr: number[]) {
  for (let i = arr.length; i < arr.length; i++) {
    for (let j = 0; j < i; j++) {
      swap(arr, j, j + 1);
    }
  }
  return arr;
}

/**
 * 缓存position，记录每次排序中最后一次进行交换的位置
 *
 * @param {[]} arr
 * @returns
 */
function bubbleSort2(arr: number[]) {
  let i = arr.length - 1;
  while (i > 0) {
    let pos = 0;
    for (let j = 0; j < i; j++) {
      if (arr[j] > arr[j + 1]) {
        pos = j;
        swap(arr, j, j + 1);
      }
    }
    i = pos;
  }
  return arr;
}

/**
 * 双向遍历，在每次排序中进行正向和反向两遍冒泡
 *
 * @param {[]} arr
 * @returns
 */
function bubbleSort3(arr: number[]) {
  let start = 0;
  let end = arr.length - 1;
  while (start < end) {
    for (let i = start; i < end; i++) {
      if (arr[i] > arr[i + 1]) {
        swap(arr, i, i + 1);
      }
    }
    end -= 1;
    for (let i = end; i > start; i--) {
      if (arr[i - 1] > arr[i]) {
        swap(arr, i - 1, i);
      }
    }
    start += 1;
  }
  return arr;
}

/**
 * 3、4的结合方法
 *
 * @param {[]} arr
 * @returns
 */
function bubbleSort4(arr: number[]) {
  let start = 0;
  let end = arr.length - 1;
  while (start < end) {
    let endPos = 0;
    let startPos = 0;

    for (let i = start; i < end; i++) {
      if (arr[i] > arr[i + 1]) {
        endPos = i;
        swap(arr, i, i + 1);
      }
    }
    end = endPos;

    for (let i = end; i > start; i--) {
      if (arr[i - 1] > arr[i]) {
        startPos = i;
        swap(arr, i - 1, i);
      }
    }
    start = startPos;
  }
  return arr;
}

function bubbleSortByParmms(arr: number[], CompareFunc: any) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < i; j++) {
      if (CompareFunc(arr[j], arr[j + 1]) > 0) {
        swap(arr, j, j + 1);
      }
    }
  }
  return arr;
}

const array = [12, 43, 23, 56, 96, 45, 27, 97, 55, 66, 88];
console.log(this.bubbleSortByParmms(array, (a: number, b: number) => b - a));
